package
{
    import flash.display.Sprite;
    import flash.events.Event;

    [SWF(frameRate="48", backgroundColor="0xFFFFFF")]
    public class Gravity extends Sprite
    {
        private var K:Number = 25;
        //G*m1*m2 를 하나의 상수(K)로 생각한겁니다. 이건 마음대로 질량을 할당해주셔도 됩니다^^ 그런데, 여기서 수상한 점은 '음수'란건데요, 그 이유는 끌어 당기는 힘이기에 힘은 중심으로 향합니다,,,  반대로 양수가 되면 반중력이 되겠죠?
        private var i:Number = 0;
        private var j:Number = 0;


        private var box1:Sprite;
        private var box2:Sprite;

        public function Gravity()
        {
            super();

            box1 = new Sprite
            box1.graphics.beginFill(0x55ffff);
            box1.graphics.drawCircle(0, 0, 15);
            box1.graphics.endFill();
            box1.x = 15;
            box1.y = 100;
            this.addChild(box1);

            box2 = new Sprite
            box2.graphics.beginFill(0xffff55);
            box2.graphics.drawCircle(0, 0, 15);
            box2.graphics.endFill();
            box2.x = 60;
            box2.y = 100;
            this.addChild(box2);

            varGen(box1);

            this.addEventListener(Event.ENTER_FRAME, enterFrameHandler, false, 0, true);
        }

        public function dis(target1:Sprite, target2:Sprite):Number
        {
            // 두 무비클립 사이의 거리를 계산 (피타고라스)
            var diffX:Number = target1.x - target2.x;
            var diffY:Number = target1.y - target2.y;
            return Math.sqrt(diffX * diffX + diffY * diffY);
        }

        public function GForceX(targetM:Sprite, targetG:Sprite):Number
        {
            //X축에 해당하는 중력 벡터
            var r:Number = dis(targetM, targetG);
            var diff:Number = targetM.x - targetG.x;
            var Fx:Number = K * diff / (r * r * r);
            return Fx;
        }

        public function GForceY(targetM:Sprite, targetG:Sprite):Number
        {
            //Y축에 해당하는 중력 벡터
            var r:Number = dis(targetM, targetG);
            var diff:Number = targetM.y - targetG.y;
            var Fy:Number = K * diff / (r * r * r);
            return Fy;
        }

        public function MoveBall(targetM:Sprite, targetG:Sprite):void
        {
            //중력이 작용하는 공을 움직이게
            tempx += GForceX(targetM, targetG);
            // 힘은 가속도x질량 이라서 임시(위치) 변수에 담고 이걸 속도 벡터에 더한뒤 다시 속도 벡터를 무비클립의 _x, _y 에 더합니다.
            tempy += GForceY(targetM, targetG);
            vx += tempx;
            vy += tempy;
            //targetM.x = ox + vx;
            //ox는 오리지널 x, 즉, 이 공이 생성된 위치 입니다..
            targetM.y = oy + vy;

            if(targetM.y > stage.stageHeight)
            {
                targetM.y = stage.stageHeight;
            }

            trace("targetM.y ", targetM.y, stage.stageHeight);
        }

        private var tempx:Number = 0;
        private var tempy:Number = 0;
        private var vx:Number = 0;
        private var vy:Number = 0;
        private var ox:Number = 0;
        private var oy:Number = 0;

        public function varGen(MBname:Sprite):void
        {
            // 중력이 작용하는 공 무비클립에 변수를 생성해주고 변수값을 초기화
            tempx = 0.5; //초기 속도의 x성분 벡터가 0.5
            tempy = 0.5; //초기 속도의 x성분 벡터가 0.5
            vx = 0;
            vy = 0;
            ox = MBname.x;
            oy = MBname.y;
        }

        private function enterFrameHandler(event:Event):void
        {
            MoveBall(box1, box2);
        }
    }
}